#!/usr/bin/env python
# -*- coding:utf-8 -*-


'''
@Author : shouke
'''

import logging

from components.decoraters.action_decorater import ActionDecorator

logger = logging.getLogger(__name__)


class CsvDataSetConfig(object):
    @ActionDecorator.action_register('read_csv_file_data', 'CsvDataSetConfig', 'read_csv_file_data', __name__)
    @classmethod
    def read_csv_file_data(self, config:dict, *args, **kwargs):
        '''
        读取csv文件数据
        :param config 配置信息，具体如下
        {
            "fileName": "./data/argfile.txt", # 文件所在路径，支持相对路径和绝对路径
            "fileEncoding": "utf-8", # 文件编码
            "variableNames": "username,password", #要求变量名称场景内唯一（ 不同链路中定义的变量可以重复）
            "ignoreFirstLine": True, #是否忽略第一行 True 是 False 否
            "delimiter": ",",#变量， 变量值之间的分隔符
            "recyleOnEOF": True, #是否循环读取 True 循环读取 False 不循环
            "independently_each_user": False # 是否每个用户独立 True 等价于每个用户从不同的文件副本读取各自所需要的数据， False 等价于每个用户用同一个文件指针、 文件句柄读取同一份文件
        }
        '''

        user = kwargs['user']
        user_resource_dict = user.user_resource_dict[user.chain_id]
        file_data_dict = kwargs['file_data_dict']
        file_name = config['fileName']
        file_encoding = config['fileEncoding']
        variable_names = config['variableNames']
        ignore_firstLine = config['ignoreFirstLine']
        delimiter = config['delimiter']
        recycle_on_eof = config['recyleOnEOF']
        independently_each_user = config['independently_each_user']

        variable_names = variable_names.split(',')
        if file_name not in file_data_dict:
            file_data_dict[file_name] = {}
            f = open(file_name, encoding=file_encoding, mode='r')
            file_data_dict[file_name]['file_handler'] = f
            file_data_dict[file_name]['read_eof'] = False # 文件最后行是否被读取
            file_data_dict[file_name]['counter'] = 0 # 用户取数计数器
            file_data_dict[file_name]['ignore_firstLine'] = ignore_firstLine # 数据索引
            file_data_dict[file_name]['data'] = []

        else:
            f = file_data_dict[file_name]['file_handler']

        if not file_data_dict[file_name]['read_eof']:
            line = f.readline()
            if file_data_dict[file_name]['ignore_firstLine']: # 忽略第一行
                line = f.readline()
                file_data_dict[file_name]['ignore_firstLine'] = False

            temp_dict = {}
            if line and line.strip():
                line = line.strip().strip(delimiter).split(delimiter)
                for variable_name, variable_value in zip(variable_names, line):
                    variable_name = variable_name.strip()
                    variable_value = variable_value.strip()
                    if variable_name:
                        temp_dict[variable_name] = variable_value
                file_data_dict[file_name]['data'].append(temp_dict)
            elif not line:
                file_data_dict[file_name]['read_eof'] = True # 文件已经读取完
        if not independently_each_user:
            if recycle_on_eof: # 循环读取
                user_resource_dict.update(file_data_dict[file_name]['data'][file_data_dict[file_name]['counter'] % len(file_data_dict[file_name]['data'])])
                file_data_dict[file_name]['counter'] += 1
            elif not file_data_dict[file_name]['read_eof']: # 如果没达到文件末尾，则继续取数，否则啥也不做
                user_resource_dict.update(file_data_dict[file_name]['data'][len(file_data_dict[file_name]['data'])-1])
        else:
            if recycle_on_eof:
                user_resource_dict.update(file_data_dict[file_name]['data'][user_resource_dict['iteration_count'] % len(file_data_dict[file_name]['data'])])
            else:
                user_resource_dict.update(file_data_dict[file_name]['data'][min(len(file_data_dict[file_name]['data']) - 1, user_resource_dict['iteration_count'])])

